package pl.peterjack.servlet.uslugi;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.LogFactoryImpl;

import pl.peterjack.SystemTools;
import pl.peterjack.model.PMF;
import pl.peterjack.model.dane.Faktura;
import pl.peterjack.model.dane.FakturaProdukt;
import pl.peterjack.model.dane.Firma;
import pl.peterjack.model.dane.Klient;
import pl.peterjack.model.dane.Pracownik;
import pl.peterjack.model.dane.PracownikUprawnienia;
import pl.peterjack.model.dane.Produkt;
import pl.peterjack.model.dane.RezultatOdpowiedz;
import pl.peterjack.servlet.dane.firma.FirmaDane;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Transaction;
import com.google.gson.Gson;

public class WystawFakture extends HttpServlet {
	
	Log log = new LogFactoryImpl().getInstance(FirmaDane.class);

	@SuppressWarnings("unchecked")
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Pracownik pracownik = (Pracownik) req.getSession().getAttribute("firma_pracownik");
		PracownikUprawnienia pracownikUprawnienie = null;
		if (pracownik != null && pracownik.getPracownikUprawnienia() != null
				&& pracownik.getPracownikUprawnienia().longValue() > 0) {
			pracownikUprawnienie = pm.getObjectById(PracownikUprawnienia.class,
					pracownik.getPracownikUprawnienia());
		}
		if (req.getSession().getAttribute("firma_klient") != null
				|| !(pracownik == null || pracownikUprawnienie == null || (pracownikUprawnienie
						.getWystawienieFaktur() != null && pracownikUprawnienie
						.getWystawienieFaktur().booleanValue()))) {
			req.getSession().invalidate();
			resp.setContentType("text/plain");
			resp.setStatus(resp.SC_MOVED_TEMPORARILY);
			resp.setHeader("Location", "/");
			return;
		}
		Firma firma = (Firma) req.getSession().getAttribute("firma");
		Klient klient = null;
		RezultatOdpowiedz result = new RezultatOdpowiedz();
	    Gson gson = new Gson();
		long istniejacy_klient = SystemTools.parseLong(req.getParameter("klient"));
	    if(istniejacy_klient>0) {
		    klient = pm.getObjectById(Klient.class, istniejacy_klient);
	    } else {
	    	klient = new Klient(); 
	    	klient.setImie( req.getParameter("imie"));
		    klient.setNazwisko( req.getParameter("nazwisko") );
		    klient.setNazwa( req.getParameter("nazwa") );
		    klient.setAdres( req.getParameter("adres") ); 
		    klient.setMiejscowosc( req.getParameter("miejscowosc") );
		    klient.setKodPocztowy( req.getParameter("kodPocztowy") ); 
		    klient.setTelefon( req.getParameter("telefon") ); 
		    klient.setEmail( req.getParameter("email") );
		    klient.setLogin( req.getParameter("login") );
		    klient.setNip( req.getParameter("nip") ); 
		    if(req.getParameter("haslo") != null && !"".equals(req.getParameter("haslo")))
		    	klient.setHaslo( req.getParameter("haslo") );
		    klient.setFirma( firma.getId() );
			// sprawdzamy czy klient nie jest juz w bazie danych
			String queryStr = "select from " + Klient.class.getName() + " where login == :p1";
			List results = (List) pm.newQuery(queryStr).execute(klient.getLogin());
			if (results.size() > 0) {
				result.setSuccess(false);
				result.setMessage("Login jest juz zajety. ");
				resp.setCharacterEncoding("UTF-8");
				resp.getWriter().println(gson.toJson(result));
				return;
			}
		    try {
		    	pm.makePersistent(klient);
		    } catch (Exception e) {
		    	e.printStackTrace();
		    	result.setSuccess(false); 
			    resp.setCharacterEncoding("UTF-8");
		    	resp.getWriter().println(gson.toJson(result));
		    	return; 
			}
	    }
	    if(klient==null) {
	    	result.setSuccess(false); 
		    resp.setCharacterEncoding("UTF-8");
	    	resp.getWriter().println(gson.toJson(result));
	    	return; 
	    }
	    int liczbaProduktow = Integer.parseInt(req.getParameter("liczbaProduktow")); 
	    int liczbaUslug = Integer.parseInt(req.getParameter("liczbaUslug"));
	    // szukamy nr faktury
	    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
	    Transaction txn = datastore.beginTransaction();
	    String queryStr = "select from " + Faktura.class.getName() + 
        " where miesiac == :p1 && rok == :p2 && firma == :p3 order by nr desc limit 1";
	    List<Faktura> results = (List<Faktura>)pm.newQuery(queryStr).execute(
	    		new Date(System.currentTimeMillis()).getMonth(), 
	    		new Date(System.currentTimeMillis()).getYear(),
	    		firma.getId());
	    int nr = 0; 
	    if(results.size()>0) {
	    	nr = results.get(results.size()-1).getNr(); 
	    }
	    nr++; 
	    // tworzymy fakture 
	    Faktura faktura = new Faktura(); 
	    faktura.setAdres(klient.getAdres());
	    faktura.setDataSprzedazy(new Date(System.currentTimeMillis())); 
	    faktura.setFirma(firma.getId()); 
	    faktura.setKlient(klient.getId()); 
	    faktura.setKodPocztowy(klient.getKodPocztowy()); 
	    faktura.setMiejscowosc(klient.getMiejscowosc()); 
	    faktura.setMiesiac(new Date(System.currentTimeMillis()).getMonth()); 
	    faktura.setNazwa(klient.getNazwa()); 
	    faktura.setNr(nr); 
	    faktura.setRok(new Date(System.currentTimeMillis()).getYear()); 
	    faktura.setWlascicielAdres(firma.getAdres()); 
	    faktura.setWlascicielKodPocztowy(firma.getKodPocztowy()); 
	    faktura.setWlascicielMiejscowosc(firma.getMiejscowosc()); 
	    faktura.setWlascicielNazwa(firma.getNazwa());
	    faktura.setWlascicielNip(firma.getNip()); 
	    faktura.setNip(klient.getNip()); 
		pm.makePersistent(faktura);
		txn.commit();
	    
	    // dodajemy produkty i uslugi
	    List<FakturaProdukt> listaProdutkow = new ArrayList<FakturaProdukt>(); 
	    for(int i = 0; i < liczbaProduktow; i++) {
	    	int istniejeProdukt = SystemTools.parseInteger(req.getParameter("listaProduktNowy"+i));
	    	Produkt produkt = null; 
	    	if(istniejeProdukt>0) {
	    		produkt = pm.getObjectById(Produkt.class, istniejeProdukt);
	    	} else {
	    		produkt = new Produkt(); 
	    		produkt.setCenaBrutto(  SystemTools.parseFloat(req.getParameter("listaProduktCenaBrutto"+i))  ); 
	    	    produkt.setCenaNetto(SystemTools.parseFloat(req.getParameter("listaProduktCenaNetto"+i))); 
	    	    produkt.setDataDodania( new Date(System.currentTimeMillis())); 
	    	    produkt.setFirma(firma.getId()); 
	    	    produkt.setNazwa(req.getParameter("listaProduktNazwa"+i));
	    	    produkt.setProcentVat(SystemTools.parseFloat(req.getParameter("listaProduktVat"+i)));
	    		pm.makePersistent(produkt);
	    	}
	    	if(produkt!=null) {
	    		FakturaProdukt fakturaProdukt = new FakturaProdukt(); 
	    		fakturaProdukt.setCenaBrutto(SystemTools.parseFloat(req.getParameter("listaProduktCenaBrutto"+i)));
	    		fakturaProdukt.setCenaNetto(SystemTools.parseFloat(req.getParameter("listaProduktCenaNetto"+i)));
	    		fakturaProdukt.setProcentVat(SystemTools.parseFloat(req.getParameter("listaProduktVat"+i)));
	    		fakturaProdukt.setFaktura(faktura.getId()); 
	    		fakturaProdukt.setIlosc(Integer.parseInt(req.getParameter("listaProduktIlosc"+i))); 
	    		fakturaProdukt.setNazwa(req.getParameter("listaProduktNazwa"+i));
	    		fakturaProdukt.setProdukt(produkt.getId()); 
	    		pm.makePersistent(fakturaProdukt);
	    		listaProdutkow.add(fakturaProdukt);
	    	}
	    } 
	    result.setSuccess(true); 
	    result.setData( faktura ); 
	    resp.setCharacterEncoding("UTF-8");
		//resp.setContentType("application/json");
        resp.getWriter().println(gson.toJson(result));
	}

	

}

